Projekt 1 - Kategoryzacja płci głosu

Maciej Chylak i Maciej Gryszkiewicz

1. EDA

Objasnienie danych zawartych w ramce

Jak widac zmienne te sa niemalże identyczne dla glosu żeńskiego jak i dla glosu meskiego. Oznacza to, że w przyszlosci bedziemy mogli je pominac w naszym modelu, bez znaczacego wplywu na jego zdolnosci predykcyjne.

2. Preprocessing

Wczytanie odpowiednich bibliotek, wczytanie ramki danych

Pozbycie się kolumn które są w pełni zależne od innych kolumn (patrz EDA)

Narysujmy rozkłady pozostałych kolumn

Przyjrzyjmy się kolumnie mindom. Mindom oznacza dokładnie minimal dominant frequency w trakcie trwanie dzwięku. Zauważmy, że większość z tych wartości jest zbliżona do zera. Odpowiada to dokładnie sytuacji, w której przez mikrofon nic nie mówiono. Jest to najprawdopodobniej charakterystyka otoczenia, co można zauważyć chociażby po następujących po sobie wierszach, w których wartości te są zbliżone do siebie. Z tego względu postanowiliśmy nie uwzględniać tej kolumny w dalszym budowaniu modelu

Zauważmy, że kolumna skew, modindx są prawoskośne, a maxfun lewoskośny. Dokonajmy odpowiednich transformacji

Sprawdźmy, czy któryś z naszych rozkładów jest zbliżony do rozkładu normalnego

Jak możemy zauważyć żadna z naszych zmiennych nie posiada rozkładu normalnego. Nie będziemy więc mogli się posłużyć metodami pozbywania się outlierów przeznaczonych dla rozkładów normalnych

Przyjrzyjmy się kolumnie mode. Określa ona częstotliwość modalną. Zauważmy, że w bardzo wielu próbkach częstotliwość modalna wynosi zero, a co za tym idzie największą część częstotliwości głosu stanowiły momenty ciszy. Jednak nie zawsze oznacza to, że znacząca część nagrania stanowiła cisza. Ponieważ nie jesteśmy w stanie określić dokładnie na tak przerobionych danych ile dokładnie ona trwała, postanowiliśmy usunąć tylko i wyłącznie te wiersze, dla których Q25 wynosiło mniej niż 60Hz, gdyż to oznacza, że 25% czasu stanowiła cisza. 60Hz, gdyż głos męski zaczyna swoje częstotliwości w granicach 85Hz, także dodaliśmy jeszcze pewien gap, aby nie wyrzucić zbyt wiele wierszy

Liczba wiersz spada nam więc z 3168 do 2915. Usuneliśmy 253 wiersze co stanowi ok. 8% danych początkowych.

3. Wybór modelu

Dokładność modeli porównywaliśmy na podstawie Accuracy oraz Area under curve. Zdecydowaliśmy się na wybranie ogólniejszej miary oceny klasyfikatora - accuracy, ponieważ nie interesuję nas tak naprawdę rozróżnienie FP od FN

Dla wszystkich modeli (dla których miało to sens) obliczyliśmy ważność zmiennych, przedstawiliśmy przykładową klasyfikacje oraz narysowaliśmy zmienną ROC

SVM

KNNeighbors

Regresja logistyczna

Naiwny Klasyfikator Bayesowski

Drzewo decyzyjne

Stackowanie (DecisionTree, NB, LogisticRegression)

XGBoost

Jako, że XGBoost charakteryzuje się najwyższymi wynikami accuracy i ROC AUCwybieramy go jako nasz model finalny.

4. Strojenie modelu

Najpierw tworzymy 3 param gridy do kolejnych etapów strojenia naszego modelu. W pierwszym z nich umieściliśmy parametry min_child_weight, max_depth, n_round i n_estimators. W następnym etapie dostrajamy parametr gamma i na koniec stroimy learning_rate (eta).

Jeżeli porównami wyniki dostrojonego XGBoosta do tego z 'losowymi' parametrami, okazuje się, że strojenie nieznacznie polepszyło nasz model. Accuracy wzrosło z ok. 96.9% do 97.3% odchylenie standardowe zmalało z 2.5pp do 2.2pp. Są to zmiany marginalne, ale na plus.

Ostateczny, wytrenowany model zapisujemy do pliku .pickle.

5. Test modelu na własnych danych